﻿/**************************************************
 * 文 件 名：Extensions.cs
 * 版    本：V1.0
 * 创 建 人：杨书林
 * 日    期：2011-5-15

 * 修 改 人：
 * 日    期：
 * 描    述：
 **************************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;

namespace Ysl.Utility
{
    /// <summary>
    /// 作 者：杨书林
    /// 日 期：2011-5-15
    /// 描 述：对.NET Framework中的类进行扩展，例如：DataSet、IDataReader
    /// </summary>
    public static class Extensions
    {
        #region 注释掉了 把对象转换成指定的类型
        /// <summary>
        /// 在需要给属性赋值的时候，为了避免数据集中的字段名与用户定义的Model属性名一致而类型不一致的问题，
        /// 写了个方法，用来把对象进行类型转换
        /// </summary>
        /// <param name="obj">对象类型</param>
        /// <param name="type"></param>
        /// <returns></returns>
        //private static object ConvertTo(this object obj, Type type)
        //{
        //    if (obj.GetType().Equals(type))
        //    {
        //        return obj;
        //    }
        //    else
        //    {
        //        try
        //        {
        //            if (type == typeof(string)) { return obj.ToString(); }
        //            MethodInfo parseMethod = null;
        //            foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static | BindingFlags.Public))
        //            {
        //                if (mi.Name == "Parse" && mi.GetParameters().Length == 1)
        //                { parseMethod = mi; break; }
        //            }
        //            if (parseMethod == null)
        //            {
        //                return null;
        //            }
        //            return parseMethod.Invoke(null, new object[] { obj });
        //        }
        //        catch
        //        {
        //            return null;
        //        }
        //    }
        //}
        #endregion

        #region 将数据表DataTable类型转换为数据列表IList<T>类型
        /// <summary>
        /// 将数据表DataTable类型转换为数据列表IList<T>类型
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="table">数据表</param>
        /// <returns>返回IList<T>类型</returns>
        public static IList<T> ToList<T>(this DataTable table) where T : new()
        {
            //验证参数的有效性
            if (table == null || table.Rows.Count <= 0)
                return null;

            IList<T> list = new List<T>();
            for (int i = 0; i < table.Rows.Count; i++)
            {
                //创建泛型对象
                T t = Activator.CreateInstance<T>();

                #region 注释掉了
                //获取泛型对象的属性
                //PropertyInfo[] propertyInfo = t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
                //for (int j = 0; j < table.Columns.Count; j++)
                //{
                //    foreach (PropertyInfo info in propertyInfo)
                //    {
                //        //属性名称和列名相同时赋值
                //        if (table.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
                //        {
                //            if (table.Rows[i][j] != DBNull.Value)
                //            {
                //                info.SetValue(t, table.Rows[i][j].ConvertTo(info.PropertyType), null);
                //            }
                //            else
                //            {
                //                info.SetValue(t, null, null);
                //            }
                //            break;
                //        }
                //    }
                //}
                #endregion

                //根据查询出的数据列名，为泛型对象的属性赋值
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    //获取泛型对象的属性
                    PropertyInfo propertyInfo = t.GetType().GetProperty(table.Columns[j].ColumnName);
                    if (propertyInfo != null && table.Rows[i][j] != DBNull.Value)
                    {
                        //设置属性的值
                        propertyInfo.SetValue(t, table.Rows[i][j], null);
                    }
                }
                list.Add(t);
            }

            return list;
        }
        #endregion

        #region 将数据集DataSet类型转换为数据列表IList<T>类型
        /// <summary>
        /// 将数据集DataSet类型转换为数据列表IList<T>类型
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="dataSet">数据集DataSet</param>
        /// <param name="tableIndex">表的索引值</param>
        /// <returns>返回IList<T>类型</returns>
        public static IList<T> ToList<T>(this DataSet dataSet, int tableIndex) where T : new()
        {
            //验证参数的有效性
            if (dataSet == null || dataSet.Tables.Count <= 0 || tableIndex < 0 || dataSet.Tables.Count <= tableIndex)
                return null;

            return dataSet.Tables[tableIndex].ToList<T>();
        }

        /// <summary>
        /// 将数据集DataSet类型转换为数据列表IList<T>类型
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="dataSet">数据源</param>
        /// <param name="tableName">表的名称</param>
        /// <returns></returns>
        public static IList<T> ToList<T>(this DataSet dataSet, string tableName) where T : new()
        {
            //验证参数的有效性
            if (dataSet == null || !dataSet.Tables.Contains(tableName))
                return null;

            return dataSet.Tables[tableName].ToList<T>();
        }
        
        #endregion

        #region 将IDataReader类型转换为数据列表IList<T>类型
        /// <summary>
        /// 将DataReader类型转换为数据列表IList<T>类型
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="reader">IDataReader</param>
        /// <returns>返回IList<T>类型</returns>
        public static IList<T> ToList<T>(this IDataReader reader)
        {
            //验证参数的有效性
            if (reader == null)
                return null;

            IList<T> list = new List<T>();
            while (reader.Read())
            {
                //创建泛型对象
                T t = Activator.CreateInstance<T>();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    //获取泛型对象的属性
                    PropertyInfo propertyInfo = t.GetType().GetProperty(reader.GetName(i));
                    if (propertyInfo != null && reader.GetValue(i) != DBNull.Value)
                    {
                        //设置属性的值
                        propertyInfo.SetValue(t, reader.GetValue(i), null);
                    }
                }
                list.Add(t);
            }
            reader.Close();

            return list;
        }
        #endregion
    }
}